查看原文
其他

Java8 Lambda 表达式中的 forEach 如何提前终止?

关注Java就该这么学带你全面认识Java
Java就该这么学后台回复 1024 有特别礼包

责编:Java就该这么学 | 来源:weixin_39597399

链接:https://blog.csdn.net/weixin_39597399/article/details/114232746

上一篇精彩:Java 池化技术你了解多少?
大家好,我是Java就该这么学。

# 情景展示



如上图所示,我们想要终止for循环,使用return。


执行结果如下:



我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。


也就是说,关键字"return",在这里执行的效果相当于普通for循环里的关键词continue"。


# 原因分析


我们知道,在普通for循环里面,想要提前结束(终止)循环体使用"break";


结束本轮循环,进行下一轮循环使用"continue";


另外,在普通for里,如果使用"return",不仅强制结束for循环体,还会提前结束包含这个循环体的整个方法。


而在Java8中的forEach()中,"break"或"continue"是不被允许使用的,而return的意思也不是原来return代表的含义了。


我们来看看源码:



forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么?当然是return啦;


java8的forEach()和JavaScript的forEach()用法是何其的相似


Java不是万能的,不要再吐槽它垃圾了。


# 解决方案


方案一:使用原始的foreach循环



使用过eclipse的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现foreach的代码提示。


如上图所示,这种格式的for循环才是真正意义上的foreach循环。


在idea中输入,按照上述操作是不会有任何代码提示的,那如何才能在idea中,调出来呢?



for循环可以提前终止。


牛逼啊!接私活必备的 N 个开源项目!赶快收藏吧


方式一:break



方式二:return(不推荐使用)



方案二:抛出异常


我们知道,要想结束一个方法的执行,正常的逻辑是:使用return;


但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止forEach()方法的目的。



如果觉得这种方式不友好,可以再包装一层。另外,搜索公众号Linux就该这样学后台回复“git书籍”,获取一份惊喜礼包。



这样,就完美了。


这里,需要注意的一点是:要确保你forEach()方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;


否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?


欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️

在 GitHub猿 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!



公众号后台回复 Java 或者 面试 有惊喜礼包!Java就该这么学交流群

 「Java就该这么学」建立了读者Java交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。

扫描添加好友邀你进Java群,加我时注明姓名+公司+职位】


版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

往日文章:

想了解Java后端学习路线?看完这篇就够了!
2天3夜开发了一个商城系统,用它挣了10.7万!
Java8 判空新写法!
一张图搞定Java原型模式
一款支持极速开发建站系统,让您快速搭建个性化独立网站!
面试官必问的 3 道 MQ 面试题,还有谁不会??
请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!
MySQL模糊查询再也用不着 like+% 了!
日志瘦身骚操作:从5G优化到1G!
一款线上网校系统,支持线上点播、知识付费、网校装修、数据统计、会员模块、角色管理等丰富功能!
CAS 与 AQS 简单理解
腾讯二面:@Bean 与 @Component 用在同一个类上,会怎么样?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存